/*
 * ComandosTorneo.h
 *
 *  Created on: 26/06/2014
 *      Author: flb
 */

#ifndef COMANDOSTORNEO_H_
#define COMANDOSTORNEO_H_

#include "defines.h"
#include "InterpreteComandosServer.h"
#include "Semaforo.h"

/*
 * Clase que modela la comunicacion del Cliente con el Torneo, contiene toda la logica para interpretar y ejecutar acciones y responder al Torneo.
 */
class ComandosTorneo {
private:
	//Instancia del juego.
    static ComandosTorneo *instance;

    //Indicador de actividad.
	bool activo;
	bool stoped;

    //------------------------------------notificaciones a los jugadores-------------------------------------------//

	//Notifica a los jugadores que comienza la partida, que numero de jugador son y cual es el nombre del otro jugador
	bool notificarInicioPartida(Socket *conexion);
	/* Envia a los jugadores la accion de finalizar partida */
	void notificarFinPartida();
	/* Notifica a los jugadores si ya se termino el tramo y o el nivel, con las acciones correspondientes */
	void notificarFinTramoONivel();



public:
    	//----------------------------------------------Basicos----------------------------------------------------//
	//GetInstance del patrón singleton
    static ComandosTorneo* getInstance();
    //Constructor por defecto.
    ComandosTorneo();
    //Destructor.
    ~ComandosTorneo();
    //Ver si sigue activa la partida
    bool isActivo();

    //Getters
    t_partida *getPartida();
    t_jugador *getJugadorXNro(unsigned short int);
    bool isStoped();

    //Setters
    void setStoped(bool stoped);

    /* Metodo que inicializa la partida, y envia a los jugadores que numero de jugador son y el nombre de su contrincante */
    bool iniciarTorneo(Socket *conexion);

    /* Metodo que actualiza el ranking que actualiza el serverTorneo */
    void refreshStatsJugadores(bool puntaje, bool ranking);

	//-------------------------------------------Utilitarios--------------------------------------------------//

	//Agrega la t_accion recibida por parámetro, a la cola de t_acciones a ejecutar.
	void encolarAccionAProcesar(t_accion action);
	//Va sacando de la cola de t_acciones, para ejecutarlas.
	t_accion desencolarAccionAProcesar();
	//Procesa el siguiente evento en la cola de t_acciones a procesar.
	void procesarAccion();

    //---------------------------------------acciones Solicitadas-----------------------------------------------//

	/* Ejecuta la accion al terminar la partida */
	bool salirDelJuego(t_accion *action);

	//---------------------------------------------------------------------------------------------------//

};

#endif /* COMANDOSTORNEO_H_ */
